#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<sys/types.h>
#define SEP " "
#define MAX_ARGC 64
#define SIZE 1024
char *argv[MAX_ARGC];
char env[SIZE];
char*pwd[SIZE];
int lastcode=0;
const char *HostName()
{
char*hostname=getenv("HOSTNAME");
if(hostname)return hostname;
else return "None";
}

const char* UserName()
{ 
char*hostname=getenv("USER");
if(hostname)return hostname;
else return "None";
}
const char*CurrentWorkDir()
{
char*hostname=getenv("PWD");
if(hostname)return hostname;
else return "None";
}
char*Home()
{
return getenv("HOME");
}

int Interactive(char out[],int size)
{

printf("[%s@%s %s]$ ",UserName(),HostName(),CurrentWorkDir());
fgets(out,size,stdin);
out[strlen(out)-1]='\0';
return strlen(out);
}

void Split(char in[])
{

int i=0;
argv[i++]=strtok(in,SEP);
while(argv[i++]=strtok(NULL,SEP));
}

void Execute()
{
pid_t id=fork();
if(id==0)
{
execvp(argv[0],argv);
exit(1);
}
int status=0;
pid_t rid=waitpid(id,&status,0);
if(rid==id)lastcode=WEXITSTATUS(status);
//printf("run done,rid:%d\n",rid);

}
int BulidinCmd()
{
	int ret=0;
if(strcmp("cd",argv[0])==0)
{
ret=1;
char*target=argv[1];
if(!target) target=Home();
chdir(target);
char temp[1024];
getcwd(temp,1024);


snprintf(pwd,SIZE,"PWD=%s",temp);
putenv(pwd);
}
	else if(strcmp("export",argv[0])==0)
		{
			ret=1;
			if(argv[1])
			{
			strcpy(env,argv[1]);
			putenv(env);
			}
		}		
	else if(strcmp("echo",argv[0])==0)
	{
	ret=1;
		if(argv[1]==NULL)
		{
		printf("\n");
		}
		else{
			if(argv[1][0]=='$')
			{
				if(argv[1][1]=='?')
				{
				printf("%d\n",lastcode);
	 			lastcode=0;
				}
				else
				{
				char*e=getenv(argv[1]+1);
				if(e)
				printf("%s\n",e);
				}
			}
			else
			{
			printf("%s\n",argv[1]);
			}
			}		
	}
return ret;
}
int main()
{
	while(1){
char commandline[SIZE];
int n=Interactive(commandline,SIZE);
if(n==0)continue;
Split(commandline);
n=BulidinCmd();
if(n)continue;
Execute();
//for(int i=0;argv[i];i++)
//{
//printf("argv[%d]=%s\n",i,argv[i]);
//}
	}
return 0;
}
